package a0.commonAPI.string;

import org.junit.Test;

/**
 * 开发中经常使用"+"拼接字符串(String),效率很低,
 * 因为String不可变，拼接相等于创建新对象
 */
public class StringBufferDemo {


    /**
     * 用法
     */
    @Test
    public void test() {

        String a = "fg";
        String b = a + "gfd";
        String c = b + "fv";
        //初始化一个容量默认为16的字符数组
        StringBuffer stringBuffer = new StringBuffer();
        //自定义初始化容量
        // 如果知道要追加的数据长度时，可调用初始化容量的构造器，
        //   降低扩充次数，提高性能
        StringBuffer stringBuffer1 = new StringBuffer(100);
        stringBuffer.append("fg");
        stringBuffer.append("gfd").append("fv");


    }


    /**
     * StringBuffer原理：
     * 内部采用字符数组存储字符串，
     * 默认长度为16,超过数据容量时，动态扩充为 oldLength *2 +2
     * (value.length << 1) + 2;
     * 0001 << 1  ==>0010
     * 1             2
     * 如果知道要追加的数据长度时，可调用初始化容量的构造器，
     * 降低扩充次数，提高性能
     * 特点：线程安全(synchronized)
     */
    @Test
    public void test1() {
        String s = "";

        System.out.println(s);
        StringBuffer sb = new StringBuffer();

        long startTime1 = System.currentTimeMillis();

        // s = s+ 1;
        // s = s+2;
        for (int i = 0; i < 10000; i++) {
            s += i;
        }

        long endTime1 = System.currentTimeMillis();

        long startTime2 = System.currentTimeMillis();

        for (int i = 0; i < 10000; i++) {
            sb.append(i);
        }
        long endTime2 = System.currentTimeMillis();

        System.out.println("time1: " + (endTime1 - startTime1));
        System.out.println("time1: " + (endTime2 - startTime2));
    }
}
